package com.xneure.utils.cipher;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;

public class RSA_Encrypt {
	/** 指定加密算法为DESede */
	private static String ALGORITHM = "RSA";
	/** 指定key的大小 */
	public static int KEYSIZE = 1024;

	private static KeyPair kp;

	public static void initKey() {
		KeyPairGenerator kpg;
		try {
			SecureRandom sr = new SecureRandom();
			// 为RSA算法创建一个KeyPairGenerator对象 */
			kpg = KeyPairGenerator.getInstance(ALGORITHM);
			kpg.initialize(KEYSIZE, sr);
			// 生成密钥对
			kp = kpg.generateKeyPair();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */

	}

	/** 得到公钥 */
	public static Key getPublicKey() {
		return kp.getPublic();
	}

	/** 得到私钥 */
	public static Key getPrivateKey() {
		return kp.getPrivate();
	}

	public static void saveKey(Key k, String file) {
		/** 用对象流将生成的密钥写入文件 */
		ObjectOutputStream oos;
		try {
			oos = new ObjectOutputStream(new FileOutputStream(file));
			oos.writeObject(k);
			/** 清空缓存，关闭文件输出流 */
			oos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static Key readKey(String file) {
		/** 将文件中的公钥对象读出 */
		Key key = null;
		try {
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
			key = (Key) ois.readObject();
			ois.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return key;

	}

	/**
	 * 加密方法 source： 源数据
	 */
	public static String encrypt(String source, Key k) throws Exception {
		/** 得到Cipher对象来实现对源数据的RSA加密 */
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, k);
		/** 执行加密操作 */
		return SimpleEncode.encodeBase64(cipher.doFinal(source.getBytes()));
	}

	/**
	 * 解密算法 cryptograph:密文
	 */
	public static String decrypt(String cryptograph, Key k) throws Exception {
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, k);
		/** 执行解密操作 */
		return new String(cipher.doFinal(SimpleEncode.decodeBase64((cryptograph))));
	}

//	public static void main(String[] args) throws Exception {
//		String source = "Hello World!";// 要加密的字符串
//		File pf = new File("publickey.key");
//		File pf1 = new File("privatekey.key");
//		Key pk = null,pk1 = null;
//		if (pf.exists() == false) {
//			initKey();
//			pk = getPublicKey();
//			saveKey(pk, pf.getPath());
//		}else{
//			pk=readKey(pf.getPath());
//		}
//		if (pf1.exists() == false) {
//			pk1 = getPrivateKey();
//			saveKey(pk1, pf1.getPath());
//		}else{
//			pk1=readKey(pf1.getPath());
//		}
//		String cryptograph = encrypt(source,pk);// 生成的密文
//		System.out.println(cryptograph);
//
//		String target = decrypt(cryptograph,pk1);// 解密密文
//		System.out.println(target);
//	}
}